home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockWordpressService.js < prev    next >
Text File  |  2007-10-18  |  21KB  |  627 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16.  
  17. const ENABLE_DEBUG = true; // switch to turn off slow debug code for production
  18. function DEBUG(x) { if (ENABLE_DEBUG) debug("flockWordpressService: "+x+"\n"); }
  19.  
  20. const Cc = Components.classes;
  21. const Ci = Components.interfaces;
  22. const Cr = Components.results;
  23.  
  24. const WORDPRESS_CID = Components.ID('{458ca863-38fd-4c9b-b76b-44f0453a62cd}');
  25. const WORDPRESS_CONTRACTID = '@flock.com/people/wordpress;1';
  26. const SERVICE_ENABLED_PREF          = "flock.service.wordpress.enabled";
  27. const CATEGORY_COMPONENT_NAME       = "Wordpress JS Component"
  28. const CATEGORY_ENTRY_NAME           = "wordpress"
  29.  
  30. const WORDPRESS_FAVICON = 'http://www.wordpress.com/favicon.ico';
  31.  
  32. const RDFS = Cc['@mozilla.org/rdf/rdf-service;1'].getService (Ci.nsIRDFService);
  33.  
  34. var gCompTK;
  35. function getCompTK() {
  36.   if (!gCompTK) {
  37.     gCompTK = Components.classes["@flock.com/singleton;1"]
  38.                         .getService(Components.interfaces.flockISingleton)
  39.                         .getSingleton("chrome://browser/content/flock/services/common/load-compTK.js")
  40.                         .wrappedJSObject;
  41.   }
  42.   return gCompTK;
  43. }
  44.  
  45. function loadSubScript(spec) {
  46.   var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  47.   var context = {};
  48.   loader.loadSubScript(spec, context);
  49.   return context;
  50. }
  51.  
  52. var loader = Cc['@mozilla.org/moz/jssubscript-loader;1'].getService(Ci.mozIJSSubScriptLoader);
  53.  
  54. loader.loadSubScript('chrome://browser/content/utilityOverlay.js');
  55. loader.loadSubScript("chrome://flock/content/xmlrpc/xmlrpchelper.js");
  56. loader.loadSubScript("chrome://flock/content/blog/blogBackendLib.js");
  57.  
  58.  
  59. function userBlogsListener(aListener){
  60.   this.listener = aListener;
  61. }
  62.  
  63. userBlogsListener.prototype =
  64. {
  65.   // aResult is an Array (simpleEnumerator) of struct objects
  66.   onResult: function(aResult) {
  67.     var result = new Array();
  68.     for (i=0; i<aResult.length; i++){
  69.       var entry = aResult[i];
  70.       var newAccount = new BlogAccount(entry.blogName);
  71.       newAccount.blogid = entry.blogid;
  72.       newAccount.apiLink = "";
  73.       newAccount.URL = entry.url;
  74.       result.push(newAccount);
  75.     }
  76.     this.listener.onResult(new simpleEnumerator(result));
  77.   },
  78.   onError: function(errorcode, errormsg) {
  79.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  80.     error.serviceErrorCode = errorcode;
  81.     error.serviceErrorString = errormsg;
  82.     this.listener.onError(error);
  83.   },
  84.   onFault: function(errorcode, errormsg) {
  85.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  86.     error.serviceErrorCode = errorcode;
  87.     error.serviceErrorString = errormsg;
  88.     switch (errorcode) {
  89.       case 0: // Invalid login/pass
  90.         error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  91.         error.errorString = "Bad authentication";
  92.         break;
  93.       default: // Unknown error code
  94.         error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  95.         error.errorString = "Unknown Error";
  96.     }
  97.     this.listener.onFault(error);
  98.   }
  99. }
  100.  
  101.  
  102. function flockWPService () {
  103.   var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  104.   obs.addObserver(this, 'xpcom-shutdown', false);
  105.   this.status = Ci.flockIWebService.STATUS_UNKNOWN;
  106.   this.initialized = false;
  107.  
  108.   this._ctk = {
  109.     interfaces: [
  110.       "nsISupports",
  111.       "nsIClassInfo",
  112.       "nsIObserver",
  113.       "nsISupportsCString",
  114.       "flockIWebService",
  115.       "flockIAuthenticateNewAccount",
  116.       "flockIManageableWebService",
  117.       "flockIBlogWebService"
  118.     ],
  119.     shortName: "wordpress",
  120.     fullName: "WordPress.com",
  121.     description: "WordPress.com Web Service",
  122.     favicon: WORDPRESS_FAVICON,
  123.     CID: WORDPRESS_CID,
  124.     contractID: WORDPRESS_CONTRACTID,
  125.     accountClass: flockWPAccount
  126.   };
  127.   this._profiler = Cc["@flock.com/profiler;1"].getService(Ci.flockIProfiler);
  128.  
  129.   this.init();
  130. }
  131.  
  132. // nsIObserver
  133. flockWPService.prototype.observe = function flockWPService_observe(subject, topic, state) {
  134.   switch (topic) {
  135.     case 'xpcom-shutdown':
  136.       var obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  137.       obs.removeObserver(this, 'xpcom-shutdown');
  138.       return;
  139.   }
  140. }
  141.  
  142. flockWPService.prototype.addAccount =
  143. function flockWPService_addAccount(aUsername, aPassword, aListener)
  144. {
  145.   //DEBUG("{flockIWebService}.addAccount('"+aUsername+"', 'XXXXXXXX', ...)");
  146.   //DEBUG(" THIS FUNCTION IS DEPRECATED AND SHOULD BE REPLACED WITH A CALL TO addAccountById() !");
  147.   return this.addAccountById(aUsername, true, aListener);
  148. }
  149.  
  150. flockWPService.prototype.addAccountById =
  151. function flockWPService_addAccountById(aUsername, aIsTransient, aListener)
  152. {
  153.   var accountURN = this.urn+":"+aUsername;
  154.   var account = new this.faves_coop.Account(accountURN, {
  155.     name: aUsername,
  156.     serviceId: this.contractId,
  157.     service: this.wpService,
  158.     accountId: aUsername,
  159.     isPollable : false,
  160.     isTransient: aIsTransient,
  161.     favicon: this.icon,
  162.     URL: this.url,
  163.     showInSidebar: false
  164.   });
  165.   this.faves_coop.accounts_root.children.addOnce(account);
  166.   // this.USER = blAccount.id();
  167.   // var acct = this.getAccount(blAccount.id());
  168.  
  169.   this.USER = accountURN;
  170.  
  171.   // Add the blog account
  172.   var wpsvc = this;
  173.   var listener = {
  174.     onResult: function(aResult) {
  175.       var theBlog;
  176.       while (aResult.hasMoreElements()) {
  177.         theBlog = aResult.getNext();
  178.         theBlog.QueryInterface(Ci.flockIBlogAccount);
  179.         theCoopBlog = new wpsvc.faves_coop.Blog(accountURN+":"+theBlog.blogid, {
  180.           name: theBlog.title,
  181.           title: theBlog.title,
  182.           blogid: theBlog.blogid,
  183.           URL: theBlog.URL,
  184.           apiLink: theBlog.URL+'xmlrpc.php'
  185.         });
  186.         account.children.addOnce(theCoopBlog);
  187.         dump("Added the wordpress blog "+theBlog.title+"\n");
  188.  
  189.         // Comments: create the "My Blogs" folder if needed
  190.         var feedManager = Components.classes["@flock.com/feed-manager;1"].getService(Components.interfaces.flockIFeedManager);
  191.         var blogFolder = null;
  192.         var _enum = feedManager.getFeedContext("news").getRoot().getChildren();
  193.         while (_enum.hasMoreElements() && !blogFolder) {
  194.           var candidate = _enum.getNext();
  195.           if (candidate.getTitle() == "My Blogs")
  196.             blogFolder = candidate;
  197.         }
  198.         if (!blogFolder)
  199.           blogFolder = feedManager.getFeedContext("news").getRoot().addFolder("My Blogs");
  200.         // Comments: add the stream
  201.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  202.         var uri = ios.newURI(theBlog.URL+"comments/feed/", null, null);
  203.         var feedManagerListener = {
  204.           onGetFeedComplete: function(feed) {
  205.             blogFolder.subscribeFeed(feed);
  206.             Cc["@flock.com/metrics-service;1"]
  207.               .getService(Ci.flockIMetricsService)
  208.               .report("FeedsSidebar-AddFeed",  "WordPressNewAccount");
  209.           },
  210.           onError: function(error) {
  211.           }
  212.         }
  213.         feedManager.getFeed(uri, feedManagerListener);
  214.       }
  215.       if (aListener) aListener.onSuccess(acct, "addAccount");
  216.     },
  217.     onFault: function(aError) {
  218.       aError.errorCode = aError.BLOG_INVALID_AUTH;
  219.       wpsvc.faves_coop.accounts_root.children.remove(account);
  220.       account.destroy();
  221.       if(aListener) {
  222.         aListener.onError(null, 'FAULT', aError);
  223.       }
  224.     },
  225.     onError: function(aError) {
  226.       aError.errorCode = aError.BLOG_INVALID_AUTH;
  227.       wpsvc.faves_coop.accounts_root.children.remove(account);
  228.       account.destroy();
  229.       if(aListener) {
  230.         aListener.onError(null, 'ERROR', aError);
  231.       }
  232.     }
  233.   };
  234.  
  235.   this.getUsersBlogs(listener, null);
  236.  
  237.   var acct = this.getAccount(accountURN);
  238.   return acct;
  239. }
  240.  
  241.  
  242. flockWPService.prototype.init =
  243. function ()
  244. {
  245.   DEBUG(".init()");
  246.  
  247.   if (this.initialized) return;
  248.   this.initialized = true;
  249.  
  250.   var evtID = this._profiler.profileEventStart("wp-init");
  251.  
  252.   this.prefService = Components.classes["@mozilla.org/preferences-service;1"]
  253.                                .getService(Components.interfaces.nsIPrefBranch);
  254.   if ( this.prefService.getPrefType(SERVICE_ENABLED_PREF) &&
  255.        !this.prefService.getBoolPref(SERVICE_ENABLED_PREF) )
  256.   {
  257.     DEBUG("Pref "+SERVICE_ENABLED_PREF+" set to FALSE... not initializing.");
  258.     var catMgr = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
  259.     catMgr.deleteCategoryEntry("wsm-startup", CATEGORY_COMPONENT_NAME, true);
  260.     catMgr.deleteCategoryEntry("flockWebService", CATEGORY_ENTRY_NAME, true);
  261.     return;
  262.   }
  263.  
  264.   // Logger
  265.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  266.   this.logger.init("wordpress");
  267.  
  268.   // Attributes of flockIBlogWebService
  269.   this.supportsCategories = 2;
  270.   this.supportsPostReplace = true;
  271.   this.metadataOverlay = "";
  272.  
  273.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  274.  
  275.   this.faves_coop = Cc["@flock.com/singleton;1"]
  276.                     .getService(Ci.flockISingleton)
  277.                     .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  278.                     .wrappedJSObject;
  279.     this.account_root = this.faves_coop.accounts_root;
  280.  
  281.     this.wpService = new this.faves_coop.Service('urn:wordpress:service');
  282.   this.wpService.name = 'wordpress';
  283.   this.wpService.desc = 'The Wordpress.com Service';
  284.   this.wpService.logoutOption = false;
  285.   this.wpService.domains = "wordpress.com";
  286.   this.wpService.serviceId = WORDPRESS_CONTRACTID;
  287.  
  288.   this.urn = this.wpService.id();
  289.   this.url = "http://www.wordpress.com";
  290.  
  291.   this.webDetective = this.acUtils.useWebDetective("wordpress.xml");
  292.  
  293.   this._profiler.profileEventEnd(evtID, "");
  294. }
  295.  
  296.  
  297. flockWPService.prototype.refresh =
  298. function flockWPService_refresh(aURN, aListener)
  299. {
  300.     debug ("flockWPService refresh with aURN of " + aURN + "\n");
  301.  
  302.     // Introspection against what we're syncing - Identity or Account or Item?
  303.     var refreshItem = this.faves_coop.get(aURN);
  304.  
  305.   if (refreshItem instanceof this.faves_coop.Account) {
  306.     }
  307.   else if (refreshItem instanceof this.faves_coop.Favorite) {
  308.     }
  309.   else {
  310.         throw Components.results.NS_ERROR_ABORT;
  311.     }
  312. }
  313.  
  314. flockWPService.prototype.refreshAccount =
  315. function flockWPService_refreshAccount (aURN, aListener) {
  316.   debug("WPService - refreshAccount with aURN of " + aURN);
  317. }
  318.  
  319.  
  320. // BEGIN flockIBlogWebService interface
  321.  
  322. flockWPService.prototype._youtubize = function WPS_youtubize (aContent) {
  323.   var result = aContent;
  324.  
  325.   var re = /<object.*><param.*value="(.+?)".*>.*<\/object>/;
  326.   var arr = re.exec(result);
  327.   while (arr) {
  328.     result = result.replace(arr[0], "[youtube="+arr[1].replace('/v/', '/w/?v=')+"]");
  329.     arr = re.exec(result);
  330.   }
  331.   return result;
  332. }
  333.  
  334. flockWPService.prototype.newPost =
  335. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  336. {
  337.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  338.   aPost.description = this._youtubize(aPost.description);
  339.   mtService.newPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  340. }
  341.  
  342. flockWPService.prototype.editPost =
  343. function(aListener, aBlogId, aPost, aPublish, aNotifications)
  344. {
  345.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  346.   // Bug 10368: Wordpress.com's date parsing is buggy, so we clear the date
  347.   // so the date of the original post is used
  348.   aPost.issued = null;
  349.   mtService.editPost(aListener, aBlogId, aPost, aPublish, aNotifications);
  350. }
  351.  
  352. flockWPService.prototype.deletePost =
  353. function(aListener, aBlogId, aPostid)
  354. {
  355.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  356.   mtService.deletePost(aListener, aBlogId, aPostid);
  357. }
  358.  
  359. flockWPService.prototype.getUsersBlogs =
  360. function(aListener, aUrl)
  361. {
  362.   var username = this.faves_coop.get(this.USER).name;
  363.   var pw = this.acUtils.getPassword(this.urn+':'+username);
  364.  
  365.   var listener = new userBlogsListener(aListener, false);
  366.   var xmlrpcServer = new flockXmlRpcServer ('http://wordpress.com/xmlrpc.php');
  367.   var args = ["flockbrowser", username, pw.password];
  368.   xmlrpcServer.call("blogger.getUsersBlogs", args, listener);
  369. }
  370.  
  371. flockWPService.prototype.getRecentPosts =
  372. function(aListener, aBlogId, aNumber)
  373. {
  374.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  375.   mtService.getRecentPosts(aListener, aBlogId, aNumber);
  376. }
  377.  
  378. flockWPService.prototype.getCategoryList =
  379. function(aListener, aBlogId)
  380. {
  381.   var mtService = Cc['@flock.com/blog/service/movabletype;1'].getService(Ci.flockIBlogWebService);
  382.   mtService.getCategoryList(aListener, aBlogId);
  383. }
  384. // END flockIBlogWebService interface
  385.  
  386.  
  387. // BEGIN flockIManageableWebService interface
  388.  
  389. flockWPService.prototype.getCredentialsFromForm =
  390. function flockWPService_getCredentialsFromForm(aForm)
  391. {
  392.   this.logger.debug("{flockIManageableWebService}.getCredentialsFromForm(aForm)");
  393.   aForm.QueryInterface(Ci.nsIDOMHTMLFormElement);
  394.   this.lastPassword = this.acUtils.extractPasswordFromHTMLForm(aForm);
  395.  
  396.   return {
  397.     QueryInterface: function(aIID) {
  398.       if (!aIID.equals(Ci.nsISupports) &&
  399.           !aIID.equals(Ci.nsIPassword) &&
  400.           !aIID.equals(Ci.flockIPassword)) { 
  401.         throw Ci.NS_ERROR_NO_INTERFACE;
  402.       }
  403.       return this;
  404.     },
  405.     host: "",
  406.     user: this.lastPassword.user,
  407.     password: this.lastPassword.password,
  408.     formType: "login"
  409.   };
  410. }
  411.  
  412.  
  413. flockWPService.prototype.getAccountIDFromDocument =
  414. function flockWPService_getAccountIDFromDocument(aDocument)
  415. {
  416.   this.logger.debug("{flockIManageableWebService}.getAccountIDFromDocument(aDocument)");
  417.   aDocument.QueryInterface(Components.interfaces.nsIDOMHTMLDocument);
  418.  
  419.   var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  420.   var results2 = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  421.   if (this.webDetective.detect("wordpress", "blogURL", aDocument, results)) {
  422.     this.blogURL = results.getPropertyAsAString("blogURL").replace("/wp-admin","");
  423.   }
  424.   else // The landing page IS the blog URL
  425.     this.blogURL = aDocument.URL;
  426.  
  427.   if (this.webDetective.detect("wordpress", "accountinfo", aDocument, results2))
  428.     return results2.getPropertyAsAString("accountid");
  429.   else if (this.lastPassword)
  430.     return this.lastPassword.user;
  431.   else
  432.     return null;
  433. }
  434.  
  435. flockWPService.prototype.updateAccountStatusFromDocument =
  436. function flockWPService_updateAccountStatusFromDocument(aDocument)
  437. {
  438.   this.logger.debug("{flockIManageableWebService}.updateAccountStatusFromDocument()");
  439.   if (this.ownsDocument(aDocument)) {
  440.     if (this.docRepresentsSuccessfulLogin(aDocument)) {
  441.       var accountID = this.getAccountIDFromDocument(aDocument);
  442.       var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
  443.       
  444.       var avatarURL;
  445.       var results = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag2);
  446.       if (this.webDetective.detect("wordpress", "accountinfo", aDocument, results)) {
  447.         try {
  448.           avatarURL = results.getPropertyAsAString("avatarURL");
  449.         } catch (ex) {
  450.           // No avatar was found on the page
  451.         }
  452.       }
  453.  
  454.       var acctURN = this.acUtils.getAccountURNById(this.urn, accountID);
  455.       var acct = this.faves_coop.get(acctURN);
  456.       if (acct) {
  457.         acct.avatar = avatarURL;
  458.  
  459.         var accounts = this.faves_coop.Account.find({
  460.           serviceId: WORDPRESS_CONTRACTID
  461.         });
  462.         for (var i = 0; i < accounts.length; i++) {
  463.           if (accounts[i].id() == acctURN) {
  464.             accounts[i].isAuthenticated = true;
  465.           } else {
  466.             accounts[i].isAuthenticated = false;
  467.           }
  468.         }
  469.       }
  470.     } else {
  471.       var login = aDocument.getElementById("Login");
  472.       if (login) {
  473.         this.acUtils.markAllAccountsAsLoggedOut(WORDPRESS_CONTRACTID);
  474.       }
  475.     }
  476.   }
  477. }
  478.  
  479. flockWPService.prototype.logout =
  480. function flockWPService_logout(aDocument)
  481. {
  482.   this.logger.debug("{flockIManageableWebService}.logout()");
  483.   this.acUtils.removeCookies(this.webDetective.getSessionCookies("wordpress"));
  484. }
  485.  
  486. // END flockIManageableWebService interface
  487.  
  488.  
  489.  
  490. // ================================================
  491. // ========== BEGIN XPCOM Module support ==========
  492. // ================================================
  493.  
  494. function createModule(aParams) {
  495.   var Cc = Components.classes;
  496.   var Ci = Components.interfaces;
  497.   var Cr = Components.results;
  498.   return {
  499.     registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
  500.       aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
  501.       aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
  502.                                         aParams.contractID, aFileSpec,
  503.                                         aLocation, aType );
  504.       var catMgr = Cc["@mozilla.org/categorymanager;1"]
  505.         .getService(Ci.nsICategoryManager);
  506.       if (!aParams.categories) { aParams.categories = []; }
  507.       for (var i = 0; i < aParams.categories.length; i++) {
  508.         var cat = aParams.categories[i];
  509.         catMgr.addCategoryEntry( cat.category, cat.entry,
  510.                                  cat.value, true, true );
  511.       }
  512.     },
  513.     getClassObject: function (aCompMgr, aCID, aIID) {
  514.       if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
  515.       if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
  516.       return { // Factory
  517.         createInstance: function (aOuter, aIID) {
  518.           if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
  519.           var comp = new aParams.componentClass();
  520.           if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
  521.           return comp.QueryInterface(aIID);
  522.         }
  523.       };
  524.     },
  525.     canUnload: function (aCompMgr) { return true; }
  526.   };
  527. }
  528.  
  529. // NS Module entrypoint
  530. function NSGetModule(aCompMgr, aFileSpec) {
  531.   return createModule({
  532.     componentClass: flockWPService,
  533.     CID: WORDPRESS_CID,
  534.     contractID: WORDPRESS_CONTRACTID,
  535.     componentName: CATEGORY_COMPONENT_NAME,
  536.     implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
  537.     categories: [
  538.       { category: "wsm-startup", entry: CATEGORY_COMPONENT_NAME, value: WORDPRESS_CONTRACTID },
  539.       { category: "flockWebService", entry: CATEGORY_ENTRY_NAME, value: WORDPRESS_CONTRACTID }
  540.     ]
  541.   });
  542. }
  543.  
  544. // ========== END XPCOM Module support ==========
  545.  
  546.  
  547. /* ********** Account Class ********** */
  548.  
  549. function flockWPAccount() {
  550.   this.logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  551.   this.logger.init("wordpressAccount");
  552.  
  553.   this.faves_coop = Cc["@flock.com/singleton;1"]
  554.                     .getService(Ci.flockISingleton)
  555.                     .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  556.                     .wrappedJSObject;
  557.  
  558.   this.acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  559.   this.webDetective = this.acUtils.useWebDetective("wordpress.xml");
  560.   this.service = Cc[WORDPRESS_CONTRACTID].getService(Ci.flockIBlogWebService)
  561. }
  562.  
  563. // nsISupports implementation
  564. flockWPAccount.prototype.QueryInterface = function(iid) {
  565.   if (!iid.equals(Ci.nsISupports) &&
  566.     !iid.equals(Ci.flockIWebServiceAccount) &&
  567.     !iid.equals(Ci.flockIBlogWebServiceAccount))
  568.   {
  569.     throw Components.results.NS_ERROR_NO_INTERFACE;
  570.   }
  571.   return this;
  572. }
  573.  
  574. // flockIWebServiceAccount implementation
  575. flockWPAccount.prototype.login = function(listener) {
  576.   this.logger.info("{flockIWebServiceAccount}.login()");
  577.   if (listener) {
  578.     listener.onSuccess(this, "login");
  579.   }
  580. }
  581. flockWPAccount.prototype.logout = function(listener) {
  582.   this.logger.info("{flockIWebServiceAccount}.logout()");
  583.   var c_acct = this.faves_coop.get(this.urn);
  584.   if (c_acct.isAuthenticated) {
  585.     c_acct.isAuthenticated = false;
  586.     this.acUtils.removeCookies(this.webDetective.getSessionCookies("wordpress"));
  587.   }
  588.   if (listener) {
  589.     listener.onSuccess(this, "logout");
  590.   }
  591. }
  592. flockWPAccount.prototype.activate = function(aListener) {
  593.   this.logger.info("{flockIWebServiceAccount}.activate()");
  594. }
  595. flockWPAccount.prototype.deactivate = function(aListener) {
  596.   this.logger.info("{flockIWebServiceAccount}.deactivate()");
  597. }
  598. flockWPAccount.prototype.keep = function() {
  599.   var c_acct = this.faves_coop.get(this.urn);
  600.   c_acct.isTransient = false;
  601.   this.acUtils.makeTempPasswordPermanent(this.service.urn+':'+c_acct.accountId);
  602. }
  603. flockWPAccount.prototype.remove = function() {
  604.   this.service.removeAccount(this.urn);
  605. }
  606.  
  607. // flockIBlogWebServiceAccount implementation
  608. flockWPAccount.prototype.getBlogs = function() {
  609.   this.logger.info("{flockIBlogWebServiceAccount}.getBlogs()");
  610.   var blogsEnum = {
  611.     QueryInterface : function(iid) {
  612.       if (!iid.equals(Ci.nsISupports) &&
  613.           !iid.equals(Ci.nsISimpleEnumerator))
  614.       {
  615.         throw Components.results.NS_ERROR_NO_INTERFACE;
  616.       }
  617.       return this;
  618.     },
  619.     hasMoreElements : function() {
  620.       return false;
  621.     },
  622.     getNext : function() {
  623.     }
  624.   };
  625.   return blogsEnum;
  626. }
  627.